package com.fau.wm.service;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.Workbook;

import com.fau.wm.entity.MedicalAdmin;
import com.fau.wm.entity.MedicalRecall;
import com.fau.wm.entity.MedicalRecallDetail;
import com.fau.wm.util.Page;

/**
 * @desc 出库管理接口
 * @author kangyj
 * @datetime 2014年8月12日,上午10:18:00
 */
public interface IRecallManagerService {

	/**
	 * @desc 分页查询出库列表
	 * @param recall
	 * @param map
	 * @return
	 * @author kangyj
	 * @datetime 2014年8月12日,下午2:39:12
	 */
	public Page findRecallByPage(MedicalRecall recall, Map<String, Object> map);
	
	/**
	 * @desc 保存出库基本信息
	 * @param recall
	 * @author kangyj
	 * @datetime 2014年8月12日,下午2:44:57
	 */
	public boolean saveRecall(MedicalRecall recall, MedicalAdmin admin);
	
	/**
	 * @desc 验证输入的编号是否已存在
	 * @param serialNum
	 * @return
	 * @author suny
	 * @datetime 2014年9月4日,下午3:00:30
	 */
	public Boolean verSerialNum(String serialNum,String hospitalId);
	
	/**
	 * @desc 编辑保存出库基本信息
	 * @param recall
	 * @author kangyj
	 * @datetime 2014年8月12日,下午4:45:47
	 */
	public void saveEditRecall(MedicalRecall recall);
	
	/**
	 * @desc 删除出库
	 * @param id
	 * @author kangyj
	 * @datetime 2014年8月12日,下午3:29:27
	 */
	public void delRecall(MedicalRecall recall);
	
	/**
	 * @desc 查询出库详细集合
	 * @param recallId
	 * @return
	 * @author kangyj
	 * @datetime 2014年8月12日,下午6:50:29
	 */
	public List<MedicalRecallDetail> findRecallDetailList(String recallId);
	
	/**
	 * @desc 查询包含特定药品的出库明细
	 * @param medicineId药品ID
	 * @param warehouseId仓库ID
	 * @param map
	 * @return Page
	 * @author liy
	 * @datetime 2014年12月20日,下午5:55:28
	 */
	public Page findMedicineRecallDetailList(String medicineId,String warehouseId,Map<String, Object> map);
	
	/**
	 * @desc 保存出库明细
	 * @param recallDetail
	 * @author kangyj
	 * @datetime 2014年8月12日,下午7:05:51
	 */
	public boolean saveRecallDetail(MedicalRecallDetail recallDetail);
	
	/**
	 * @desc 保存编辑出库明细
	 * @param recallDetail
	 * @author kangyj
	 * @datetime 2014年8月12日,下午7:19:10
	 */
	public void saveEditRecallDetail(MedicalRecallDetail recallDetail);
	
	/**
	 * @desc 删除出库明细
	 * @param recallDetail
	 * @author kangyj
	 * @datetime 2014年8月12日,下午7:28:05
	 */
	public void delRecallDetail(MedicalRecallDetail recallDetail);
	
	/**
	 * @desc 验证出库详细单中药品是否存在
	 * @param recallId 出库单ID
	 * @param medicineId 药品ID
	 * @return Boolean true不存在
	 * @author kangyj
	 * @datetime 2014年8月13日,下午5:27:48
	 */
	public Boolean checkMedicineExist(String recallId, String medicineId);
	
	/**
	 * @desc 验证出库详细单中药品是否有2个及以上
	 * @param recallId 出库单ID
	 * @param medicineId 药品ID
	 * @return Boolean true不存在
	 * @author liy
	 * @datetime 2014年12月19日,下午3:12:56
	 */
	public Boolean checkMedicineExistE(String recallId, String medicineId);

	/**
	 * @desc 更新出库状态
	 * @param status
	 * @param id
	 * @author kangyj
	 * @datetime 2014年8月15日,下午3:43:22
	 */
	public void updateRecallStatus(String status, String id);
	
	/**
	 * @desc 分页查询待审核出库单
	 * @param map
	 * @param recall
	 * @return
	 * @author kangyj
	 * @datetime 2014年8月19日,下午3:17:38
	 */
	public Page findRecallAuditByPage(Map<String, Object> map, MedicalRecall recall);
	
	/**
	 * @desc 更新审核人
	 * @author kangyj
	 * @datetime 2014年8月19日,下午4:14:29
	 */
	public void updateAuditUser(MedicalAdmin auditUser, String recallId);
	
	/**
	 * @desc 通过id获得出库详细对象
	 * @param id 出库详细id
	 * @return
	 * @author kangyj
	 * @datetime 2014年8月25日,下午3:51:13
	 */
	public MedicalRecallDetail findRecallDetailById(String id);
	
	
	/**
	 * @desc 导出出库信息
	 * @param recallId
	 * @author hufq
	 * @return 
	 * @throws IOException 
	 * @datetime 2014年9月30日,上午11:15:16
	 */
	public Workbook exportRecallData(String recallId) throws Exception;
	
	/**
	 * @desc 导入出库信息
	 * @param filePath
	 * @return
	 * @throws IOException
	 * @author hufq
	 * @throws Exception 
	 * @datetime 2014年10月9日,上午9:13:02
	 */
	public String importRecallData(File filePath, MedicalAdmin admin) throws  Exception;
	
	/**
	 * @desc 提交出库审核
	 * @param sid 出库单Id
	 * @author liy
	 * @datetime 2014年12月24日,上午10:37:05
	 */
	public boolean toAudit(String sid);
	
	/**
	 * @desc 验证待出库药品仓库中是否有
	 * @param recallDetail
	 * @return
	 * @author kangyj
	 * @datetime 2015年3月10日,下午9:20:16
	 */
	public String validProExist(MedicalRecallDetail recallDetail);
	
    /**
     * @desc 下载药品出库导入模板
     * @param user
     * @return 
     * @author zhaoey
     * @throws Exception 
     * @datetime 2015年4月7日,下午1:46:11
     */
	public Workbook downloadRecallTemp(MedicalAdmin user) throws Exception;
}